{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\".\\\\diyLogo.png\" alt=\"some_text\">\n",
    "<h1> 第四讲 函数及模块基础</h1>\n",
    "<a id=backup></a>\n",
    "<H2>目录</H2>  \n",
    "\n",
    "[4.1 Python函数](#Pythonfunc)  \n",
    "[4.2 Python模块](#Pythonmodule)  \n",
    "[4.3 Numpy](#Numpy_module)     \n",
    "[4.4 Pandas](#Pandas_module)  "
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id=Pythonfunc></a>\n",
    "## 4.1 Python函数\n",
    "\n",
    "[目录](#backup)    \n",
    "函数是组织好的，可重复使用的，用来实现单一，或相关联功能的代码段。\n",
    "\n",
    "函数能提高应用的模块性，和代码的重复利用率。你已经知道Python提供了许多内建函数，比如print()。但你也可以自己创建函数，这被叫做用户自定义函数。\n",
    "### 4.1.1定义一个函数\n",
    "你可以定义一个由自己想要功能的函数，以下是简单的规则：\n",
    "\n",
    "+ 函数代码块以 def 关键词开头，后接函数标识符名称和圆括号 ()。  \n",
    "+ 任何传入参数和自变量必须放在圆括号中间，圆括号之间可以用于定义参数。  \n",
    "+ 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。  \n",
    "+ 函数内容以冒号 : 起始，并且缩进。  \n",
    "+ return [表达式] 结束函数，选择性地返回一个值给调用方，不带表达式的 return 相当于返回 None。\n",
    "<img src=\"./img/Function_1.png\" alt=\"some_text\" width=450>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1.2语法\n",
    "Python 定义函数使用 def 关键字，一般格式如下：  \n",
    "def 函数名（参数列表）:    \n",
    "> 函数体"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def hello() :\n",
    "    print(\"Hello World!\")\n",
    "\n",
    "i=hello()\n",
    "i"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def max(i, j):\n",
    "    if i > j:\n",
    "        return i\n",
    "    else:\n",
    "        return j\n",
    " \n",
    "a = 4\n",
    "b = 5\n",
    "i=1\n",
    "i=max(a, b)\n",
    "print(i,max(a, b))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 计算面积函数\n",
    "def area(width, height):\n",
    "    return width * height\n",
    " \n",
    "def print_welcome(name):\n",
    "    print(\"Welcome\", name)\n",
    " \n",
    "print_welcome(\"zhansan\")\n",
    "w = 4\n",
    "h = 5\n",
    "print(\"width =\", w, \" height =\", h, \" area =\", area(w, h))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1.3函数调用\n",
    "定义一个函数：给了函数一个名称，指定了函数里包含的参数，和代码块结构。\n",
    "\n",
    "这个函数的基本结构完成以后，你可以通过另一个函数调用执行，也可以直接从 Python 命令提示符执行。\n",
    "\n",
    "如下实例调用了 printme() 函数："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "我要调用用户自定义函数!\n",
      "再次调用同一函数\n"
     ]
    }
   ],
   "source": [
    "# 定义函数\n",
    "def printme( str ):\n",
    "   # 打印任何传入的字符串\n",
    "   print (str)\n",
    "   return\n",
    " \n",
    "# 调用函数\n",
    "printme(\"我要调用用户自定义函数!\")\n",
    "printme(\"再次调用同一函数\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "请输入一个数\n"
     ]
    }
   ],
   "source": [
    "def printme( str ):\n",
    "    print (str)\n",
    "    return\n",
    "printme(\"请输入一个数\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 可更改(mutable)与不可更改(immutable)对象\n",
    "在 python 中，strings, tuples, 和 numbers 是不可更改的对象，而 list,dict 等则是可以修改的对象。\n",
    "\n",
    "+ 不可变类型：变量赋值 a=5 后再赋值 a=10，这里实际是新生成一个 int 值对象 10，再让 a 指向它，而 5 被丢弃，不是改变 a 的值，相当于新生成了 a。\n",
    "\n",
    "+ 可变类型：变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改，本身la没有动，只是其内部的一部分值被修改了。\n",
    "\n",
    "### python 函数的参数传递：\n",
    "\n",
    "+ 不可变类型：类似 C++ 的值传递，如整数、字符串、元组。如 fun(a)，传递的只是 a 的值，没有影响 a 对象本身。如果在 fun(a) 内部修改 a 的值，则是新生成一个 a 的对象。\n",
    "\n",
    "+ 可变类型：类似 C++ 的引用传递，如 列表，字典。如 fun(la)，则是将 la 真正的传过去，修改后 fun 外部的 la 也会受影响\n",
    "\n",
    "python 中一切都是对象，严格意义我们不能说值传递还是引用传递，我们应该说传不可变对象和传可变对象。\n",
    "\n",
    "python 传不可变对象实例\n",
    "通过 id() 函数来查看内存地址变化："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2890293930288\n",
      "2890293930288\n",
      "2890293930576\n",
      "1\n"
     ]
    }
   ],
   "source": [
    "#查看参数id\n",
    "def change(a):#虚实结合，避免用局部变量做参数\n",
    "    print(id(a))   # 指向的是同一个对象\n",
    "    a=10\n",
    "    print(id(a))   # 一个新对象\n",
    " \n",
    "a=1\n",
    "print(id(a))\n",
    "change(a)\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2890293930352\n",
      "2890293930352\n",
      "2890293930576\n",
      "3\n"
     ]
    }
   ],
   "source": [
    "def change(a):\n",
    "    print(id(a))\n",
    "    a=10\n",
    "    print(id(a))\n",
    "\n",
    "a=3\n",
    "print(id(a))\n",
    "change(a)\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "可以看见在调用函数前后，形参和实参指向的是同一个对象（对象 id 相同），在函数内部修改形参后，形参指向的是不同的 id。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 传可变对象实例\n",
    "可变对象在函数里修改了参数，那么在调用这个函数的函数里，原始的参数也被改变了。例如："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 传入可变对象\n",
    "def changeme( mylist ):\n",
    "   \"修改传入的列表\"\n",
    "   mylist.append([1,2,3,4])\n",
    "   print (\"函数内取值1: \", mylist)\n",
    "   return \n",
    " \n",
    "# 调用changeme函数\n",
    "mylist = [10,20,30]\n",
    "changeme( mylist )\n",
    "print (\"函数外取值2: \", mylist)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1.4参数\n",
    "以下是调用函数时可使用的正式参数类型：\n",
    "\n",
    "+ 必需参数\n",
    "+ 关键字参数\n",
    "+ 默认参数\n",
    "+ 不定长参数\n",
    "#### 必需参数\n",
    "必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。\n",
    "\n",
    "调用 printme() 函数，你必须传入一个参数，不然会出现语法错误："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#无参数则出错\n",
    "def printme( str ):\n",
    "   \"打印任何传入的字符串\"\n",
    "   print (str)\n",
    "   return\n",
    " \n",
    "# 调用 printme 函数，不加参数会报错\n",
    "printme(\"hello\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 关键字参数\n",
    "关键字参数和函数调用关系紧密，函数调用使用关键字参数来确定传入的参数值。\n",
    "\n",
    "使用关键字参数允许函数调用时参数的顺序与声明时不一致，因为 Python 解释器能够用参数名匹配参数值。\n",
    "\n",
    "以下实例在函数 printme() 调用时使用参数名："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#使用关键字传入参数\n",
    "def printme( str ):\n",
    "   \"打印任何传入的字符串\"\n",
    "   print (str)\n",
    "   return\n",
    " \n",
    "#调用printme函数\n",
    "printme( str = \"你是菜鸟\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#以下实例中演示了函数参数的使用不需要使用指定顺序：\n",
    "def printinfo( name, age ):\n",
    "   \"打印任何传入的字符串\"\n",
    "   print (\"名字: \", name)\n",
    "   print (\"年龄: \", age)\n",
    "   return\n",
    " \n",
    "#调用printinfo函数\n",
    "printinfo( age=30, name=\"zhansan\" )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 默认参数\n",
    "调用函数时，如果没有传递参数，则会使用默认参数。以下实例中如果没有传入 age 参数，则使用默认值："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#函数默认参数实例\n",
    "def printinfo( name, age = 35 ):\n",
    "   \"打印任何传入的字符串\"\n",
    "   print (\"名字: \", name)\n",
    "   print (\"年龄: \", age)\n",
    "   return\n",
    " \n",
    "#调用printinfo函数\n",
    "printinfo( age=50, name=\"大橘子\" )\n",
    "print (\"------------------------\")\n",
    "printinfo( name=\"二狗子\" )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 不定长参数\n",
    "你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数，和上述 2 种参数不同，声明时不会命名。\n",
    "\n",
    "基本语法如下："
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "'''   \n",
    "def functionname([formal_args,] *var_args_tuple ):   \n",
    "   \"函数_文档字符串\"   \n",
    "   function_suite   \n",
    "   return [expression] \n",
    "'''"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 不定长函数参数实例\n",
    "def printinfo( arg1, *vartuple ):\n",
    "   \"打印任何传入的参数\"\n",
    "   print (\"输出: \")\n",
    "   print (arg1)\n",
    "   print (vartuple)\n",
    " \n",
    "# 调用printinfo 函数\n",
    "printinfo( 70, 60, 50, 40, 30, 20, 10 )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果在函数调用时没有指定参数，它就是一个空元组。我们也可以不向函数传递未命名的变量。如下实例："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 可写函数说明\n",
    "def printinfo( arg1, *vartuple ):\n",
    "   \"打印任何传入的参数\"\n",
    "   print (\"输出1: \")\n",
    "   print (arg1)\n",
    "   for var in vartuple:\n",
    "      print (\"输出2：\",var)\n",
    "   return\n",
    " \n",
    "# 调用printinfo 函数\n",
    "printinfo( 10 )\n",
    "printinfo( 2000, 60, 50 )\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#还有一种就是参数带两个星号 **基本语法如下：\n",
    "'''   \n",
    "def functionname([formal_args,] **var_args_dict ):\n",
    "       \"函数_文档字符串\"\n",
    "   function_suite\n",
    "   return [expression]\n",
    "'''  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#\n",
    "# 参数带**会以字典的形式导入：\n",
    "#\n",
    "def printinfo( arg1, **vardict ):\n",
    "   #\"打印任何传入的参数\"\n",
    "   print (\"输出: \")\n",
    "   print (arg1)\n",
    "   print (vardict)\n",
    " \n",
    "# 调用printinfo 函数\n",
    "printinfo(1, key=\"myword\",b=3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#如果单独出现星号 * 后的参数必须用关键字传入\n",
    "def f(a,b,*,c):\n",
    "     return a+b+c\n",
    "#f(1,2,3) \n",
    "f(1,2,c=3) # 正常"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1.5匿名函数\n",
    "python 使用 lambda 来创建匿名函数\n",
    "\n",
    "所谓匿名，意即不再使用 def 语句这样标准的形式定义一个函数。\n",
    "\n",
    "+ lambda 只是一个表达式，函数体比 def 简单很多。\n",
    "+ lambda的主体是一个表达式，而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。\n",
    "+ lambda 函数拥有自己的命名空间，且不能访问自己参数列表之外或全局命名空间里的参数。\n",
    "+ 虽然lambda函数看起来只能写一行，却不等同于C或C++的内联函数，后者的目的是调用小函数时不占用栈内存从而增加运行效率。\n",
    "#### 语法\n",
    "lambda 函数的语法只包含一个语句，如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "'''\n",
    "lambda [arg1 [,arg2,.....argn]]:expression\n",
    "'''\n",
    "sum = lambda arg1, arg2: arg1 + arg2\n",
    " \n",
    "# 调用sum函数\n",
    "print (\"相加后的值为 : \", sum( 10, 20 ))\n",
    "print (\"相加后的值为 : \", sum( 20, 20 ))"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1.6 Return语句\n",
    "return [表达式] 语句用于退出函数，选择性地向调用方返回一个表达式。不带参数值的return语句返回None。之前的例子都没有示范如何返回数值，以下实例演示了 return 语句的用法："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#\n",
    "# 带返回值的函数\n",
    "#\n",
    "a=1\n",
    "def sum( arg1, arg2 ):\n",
    "   # 返回2个参数的和.\"\n",
    "   total = arg1 + arg2\n",
    "   print (\"函数内 : \", total+a)\n",
    "   return total\n",
    " \n",
    "# 调用sum函数\n",
    "total = sum( 10, 20 )\n",
    "print (\"函数外 : \", total)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.1.7强制位置参数\n",
    "Python3.8 新增了一个函数形参语法 / 用来指明函数形参必须使用指定位置参数，不能使用关键字参数的形式。\n",
    "\n",
    "在以下的例子中：\n",
    "+ 形参 a 和 b 必须使用指定位置参数\n",
    "+ c 或 d 可以是位置形参或关键字形参\n",
    "+ 而 e 和 f 要求为关键字形参:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def f(a, b, /, c, d, *, e, f):\n",
    "    print(a, b, c, d, e, f)\n",
    "\n",
    "#f(10, 20, 30, d=40, e=50, f=60)\n",
    "#f(10, b=20, c=30, d=40, e=50, f=60)   # b 不能使用关键字参数的形式\n",
    "f(10, 20, 30, 40, 50, f=60)           # e 必须使用关键字参数的形式"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id=Pythonmodule></a>\n",
    "## 4.2  Python模块\n",
    "[目录](#backup) \n",
    "\n",
    "\n",
    "用 python 解释器编程，如果你从 Python 解释器退出再进入，那么你定义的所有的方法和变量就都消失了。\n",
    "\n",
    "为此 Python 提供了一个办法，把这些定义存放在文件中，为一些脚本或者交互式的解释器实例使用，这个文件被称为模块。\n",
    "\n",
    "模块是一个包含所有你定义的函数和变量的文件，其后缀名是.py。模块可以被别的程序引入，以使用该模块中的函数等功能。这也是使用 python 标准库的方法。\n",
    "\n",
    "下面是一个使用 python 标准库中模块的例子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "命令行参数如下:\n",
      "C:\\Users\\zeng_\\AppData\\Roaming\\Python\\Python310\\site-packages\\ipykernel_launcher.py\n",
      "--ip=127.0.0.1\n",
      "--stdin=9003\n",
      "--control=9001\n",
      "--hb=9000\n",
      "--Session.signature_scheme=\"hmac-sha256\"\n",
      "--Session.key=b\"1619aeb2-8e35-428b-8590-960ecd2b487b\"\n",
      "--shell=9002\n",
      "--transport=\"tcp\"\n",
      "--iopub=9004\n",
      "--f=c:\\Users\\zeng_\\AppData\\Roaming\\jupyter\\runtime\\kernel-v2-3704NFbhunP4F8Tt.json\n",
      "\n",
      "\n",
      "Python 路径为： ['c:\\\\VSWork\\\\Pythonwork\\\\0001', 'c:\\\\ProgramData\\\\Anaconda3\\\\envs\\\\python310\\\\python310.zip', 'c:\\\\ProgramData\\\\Anaconda3\\\\envs\\\\python310\\\\DLLs', 'c:\\\\ProgramData\\\\Anaconda3\\\\envs\\\\python310\\\\lib', 'c:\\\\ProgramData\\\\Anaconda3\\\\envs\\\\python310', '', 'C:\\\\Users\\\\zeng_\\\\AppData\\\\Roaming\\\\Python\\\\Python310\\\\site-packages', 'C:\\\\Users\\\\zeng_\\\\AppData\\\\Roaming\\\\Python\\\\Python310\\\\site-packages\\\\win32', 'C:\\\\Users\\\\zeng_\\\\AppData\\\\Roaming\\\\Python\\\\Python310\\\\site-packages\\\\win32\\\\lib', 'C:\\\\Users\\\\zeng_\\\\AppData\\\\Roaming\\\\Python\\\\Python310\\\\site-packages\\\\Pythonwin', 'c:\\\\ProgramData\\\\Anaconda3\\\\envs\\\\python310\\\\lib\\\\site-packages', 'c:\\\\ProgramData\\\\Anaconda3\\\\envs\\\\python310\\\\lib\\\\site-packages\\\\win32', 'c:\\\\ProgramData\\\\Anaconda3\\\\envs\\\\python310\\\\lib\\\\site-packages\\\\win32\\\\lib', 'c:\\\\ProgramData\\\\Anaconda3\\\\envs\\\\python310\\\\lib\\\\site-packages\\\\Pythonwin'] \n",
      "\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    " \n",
    "print('命令行参数如下:')\n",
    "for i in sys.argv:\n",
    "   print(i)\n",
    " \n",
    "print('\\n\\nPython 路径为：', sys.path, '\\n')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "+ 1、import sys 引入 python 标准库中的 sys.py 模块；这是引入某一模块的方法。\n",
    "+ 2、sys.argv 是一个包含命令行参数的列表。\n",
    "+ 3、sys.path 包含了一个 Python 解释器自动查找所需模块的路径的列表。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4.2.1 import 语句\n",
    "想使用 Python 源文件，只需在另一个源文件里执行 import 语句，语法如下："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import module1[, module2[,... moduleN]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "一个模块只会被导入一次，不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。\n",
    "\n",
    "当我们使用import语句的时候，Python解释器是怎样找到对应的文件的呢？\n",
    "\n",
    "这就涉及到Python的搜索路径，搜索路径是由一系列目录名组成的，Python解释器就依次从这些目录中去寻找所引入的模块。\n",
    "\n",
    "这看起来很像环境变量，事实上，也可以通过定义环境变量的方式来确定搜索路径。\n",
    "\n",
    "搜索路径是在Python编译或安装的时候确定的，安装新的库应该也会修改。搜索路径被存储在sys模块中的path变量，做一个简单的实验，在交互式解释器中，输入以下代码："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys\n",
    "sys.path"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "sys.path 输出是一个列表，其中第一项是空串''，代表当前目录（若是从一个脚本中打印出来的话，可以更清楚地看出是哪个目录），亦即我们执行python解释器的目录（对于脚本的话就是运行的脚本所在的目录）。\n",
    "\n",
    "因此若像我一样在当前目录下存在与要引入模块同名的文件，就会把要引入的模块屏蔽掉。\n",
    "\n",
    "了解了搜索路径的概念，就可以在脚本中修改sys.path来引入一些不在搜索路径中的模块。\n",
    "\n",
    "现在，在解释器的当前目录或者 sys.path 中的一个目录里面来创建一个fibo.py的文件，代码如下："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 斐波那契(fibonacci)数列模块\n",
    "'''''' \n",
    "def fib(n):    # 定义到 n 的斐波那契数列\n",
    "    a, b = 0, 1\n",
    "    while b < n:\n",
    "        print(b, end=' ')\n",
    "        a, b = b, a+b\n",
    "    print()\n",
    " \n",
    "def fib2(n): # 返回到 n 的斐波那契数列\n",
    "    result = []\n",
    "    a, b = 0, 1\n",
    "    while b < n:\n",
    "        result.append(b)\n",
    "        a, b = b, a+b\n",
    "    return result\n",
    "''''''"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "然后进入Python解释器，使用下面的命令导入这个模块："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "import fibo "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 \n"
     ]
    }
   ],
   "source": [
    "f.fib(1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fibo.fib2(100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'fibo'"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fibo.__name__"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### from … import 语句\n",
    "\n",
    "Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中，语法如下：   \n",
    "from modname import name1[, name2[, ... nameN]]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### from … import * 语句\n",
    "把一个模块的所有内容全都导入到当前的命名空间也是可行的，只需使用如下声明："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from modname import *"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 1 2 3 5 8 13 21 34 55 89 144 233 377 \n",
      "0.9092974268256817\n"
     ]
    }
   ],
   "source": [
    "from fibo import fib, fib2\n",
    "fib(500)\n",
    "from math import sin,cos\n",
    "y=sin(2)\n",
    "print(y)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id=Numpy_module> </a>\n",
    "## 4.3  Numpy\n",
    "\n",
    "NumPy(Numerical Python) 是 Python 语言的一个扩展程序库，支持大量的维度数组与矩阵运算，此外也针对数组运算提供大量的数学函数库。\n",
    "\n",
    "NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发，2005 年，Travis Oliphant 在 Numeric 中结合了另一个同性质的程序库 Numarray 的特色，并加入了其它扩展而开发了 NumPy。NumPy 为开放源代码并且由许多协作者共同维护开发。\n",
    "\n",
    "NumPy 是一个运行速度非常快的数学库，主要用于数组计算，包含：\n",
    "\n",
    "+ 一个强大的N维数组对象 ndarray\n",
    "+ 广播功能函数\n",
    "+ 整合 C/C++/Fortran 代码的工具\n",
    "+ 线性代数、傅里叶变换、随机数生成等功能\n",
    "### NumPy 应用\n",
    "+ NumPy 通常与 SciPy（Scientific Python）和 Matplotlib（绘图库）一起使用， 这种组合广泛用于替代 MatLab，是一个强大的科学计算环境，有助于我们通过 Python 学习数据科学或者机器学习。\n",
    "\n",
    "+ SciPy 是一个开源的 Python 算法库和数学工具包。\n",
    "\n",
    "+ SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算。\n",
    "\n",
    "+ Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。它为利用通用的图形用户界面工具包，如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口（API）。\n",
    "\n",
    "### 相关链接\n",
    "+ NumPy 官网 http://www.numpy.org/\n",
    "+ NumPy 源代码：https://github.com/numpy/numpy\n",
    "+ SciPy 官网：https://www.scipy.org/\n",
    "+ SciPy 源代码：https://github.com/scipy/scipy\n",
    "+ Matplotlib 教程：Matplotlib 教程\n",
    "+ Matplotlib 官网：https://matplotlib.org/\n",
    "+ Matplotlib 源代码：https://github.com/matplotlib/matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 4],\n",
       "       [2, 5],\n",
       "       [3, 6]])"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "a=[1,2,3,4,5,6]\n",
    "b=np.array(a)\n",
    "b.resize(2,3)\n",
    "b.transpose()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0  1  2  3]\n",
      " [ 4  5  6  7]\n",
      " [ 8  9 10 11]]\n"
     ]
    }
   ],
   "source": [
    "a=np.arange(0,12,1)\n",
    "a.resize(3,4)\n",
    "\n",
    "\n",
    "print(a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2, 7)\n"
     ]
    }
   ],
   "source": [
    "b=np.linspace(1,7,14)\n",
    "b=np.array(b)\n",
    "b=b.reshape(2,7)\n",
    "b.resize(2,7)\n",
    "print(b.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  2.,  3.,  4.,  5.],\n",
       "       [ 6.,  7.,  8.,  9., 10.]])"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b.T\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  2.,  3.,  4.,  5.],\n",
       "       [ 6.,  7.,  8.,  9., 10.]])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b.argmax()\n",
    "b.conjugate()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[[ 1.,  2.,  3.,  4.,  5.],\n",
       "         [ 6.,  7.,  8.,  9., 10.]]]])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.squeeze(b)\n",
    "b.resize(1,1,2,5)\n",
    "b.squeeze()\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<a id=Pandas_module></a>\n",
    "## 4.4  Pandas\n",
    "\n",
    "Pandas 是 Python 语言的一个扩展程序库，用于数据分析。\n",
    "\n",
    "Pandas 是一个开放源码、BSD 许可的库，提供高性能、易于使用的数据结构和数据分析工具。\n",
    "\n",
    "Pandas 名字衍生自术语 \"panel data\"（面板数据）和 \"Python data analysis\"（Python 数据分析）。\n",
    "\n",
    "Pandas 一个强大的分析结构化数据的工具集，基础是 Numpy（提供高性能的矩阵运算）。\n",
    "\n",
    "Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。\n",
    "\n",
    "Pandas 可以对各种数据进行运算操作，比如归并、再成形、选择，还有数据清洗和数据加工特征。\n",
    "\n",
    "Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。用 python 。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Pandas 应用\n",
    "Pandas 的主要数据结构是 Series （一维数据）与 DataFrame（二维数据），这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。\n",
    "\n",
    "### 数据结构\n",
    "+ Series 是一种类似于一维数组的对象，它由一组数据（各种Numpy数据类型）以及一组与之相关的数据标签（即索引）组成。\n",
    "\n",
    "+ DataFrame 是一个表格型的数据结构，它含有一组有序的列，每列可以是不同的值类型（数值、字符串、布尔型值）。DataFrame 既有行索引也有列索引，它可以被看做由 Series 组成的字典（共同用一个索引）。\n",
    "\n",
    "### 相关链接\n",
    "Pandas 官网 https://pandas.pydata.org/\n",
    "Pandas 源代码：https://github.com/pandas-dev/pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Object creation   \n",
    "See the Intro to data structures section.\n",
    "\n",
    "Creating a Series by passing a list of values, letting pandas create a default integer index:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "ename": "FileNotFoundError",
     "evalue": "[Errno 2] No such file or directory: './stocktest/stock600848.csv'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
      "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_17532/672609161.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mdata\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"./stocktest/stock600848.csv\"\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mparse_dates\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"trade_date\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mindex_col\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"trade_date\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      2\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mc:\\anaconda\\lib\\site-packages\\pandas\\util\\_decorators.py\u001b[0m in \u001b[0;36mwrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m    309\u001b[0m                     \u001b[0mstacklevel\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mstacklevel\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    310\u001b[0m                 )\n\u001b[1;32m--> 311\u001b[1;33m             \u001b[1;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    312\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    313\u001b[0m         \u001b[1;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mc:\\anaconda\\lib\\site-packages\\pandas\\io\\parsers\\readers.py\u001b[0m in \u001b[0;36mread_csv\u001b[1;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, error_bad_lines, warn_bad_lines, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options)\u001b[0m\n\u001b[0;32m    584\u001b[0m     \u001b[0mkwds\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkwds_defaults\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    585\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 586\u001b[1;33m     \u001b[1;32mreturn\u001b[0m \u001b[0m_read\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    587\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    588\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mc:\\anaconda\\lib\\site-packages\\pandas\\io\\parsers\\readers.py\u001b[0m in \u001b[0;36m_read\u001b[1;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[0;32m    480\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    481\u001b[0m     \u001b[1;31m# Create the parser.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 482\u001b[1;33m     \u001b[0mparser\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mTextFileReader\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    483\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    484\u001b[0m     \u001b[1;32mif\u001b[0m \u001b[0mchunksize\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0miterator\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mc:\\anaconda\\lib\\site-packages\\pandas\\io\\parsers\\readers.py\u001b[0m in \u001b[0;36m__init__\u001b[1;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[0;32m    809\u001b[0m             \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"has_index_names\"\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mkwds\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"has_index_names\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    810\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 811\u001b[1;33m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_make_engine\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mengine\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    812\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    813\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mc:\\anaconda\\lib\\site-packages\\pandas\\io\\parsers\\readers.py\u001b[0m in \u001b[0;36m_make_engine\u001b[1;34m(self, engine)\u001b[0m\n\u001b[0;32m   1038\u001b[0m             )\n\u001b[0;32m   1039\u001b[0m         \u001b[1;31m# error: Too many arguments for \"ParserBase\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1040\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0mmapping\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mengine\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[1;33m)\u001b[0m  \u001b[1;31m# type: ignore[call-arg]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1041\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1042\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0m_failover_to_python\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mc:\\anaconda\\lib\\site-packages\\pandas\\io\\parsers\\c_parser_wrapper.py\u001b[0m in \u001b[0;36m__init__\u001b[1;34m(self, src, **kwds)\u001b[0m\n\u001b[0;32m     49\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     50\u001b[0m         \u001b[1;31m# open handles\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 51\u001b[1;33m         \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_open_handles\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msrc\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m     52\u001b[0m         \u001b[1;32massert\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mhandles\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m     53\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mc:\\anaconda\\lib\\site-packages\\pandas\\io\\parsers\\base_parser.py\u001b[0m in \u001b[0;36m_open_handles\u001b[1;34m(self, src, kwds)\u001b[0m\n\u001b[0;32m    220\u001b[0m         \u001b[0mLet\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mreaders\u001b[0m \u001b[0mopen\u001b[0m \u001b[0mIOHandles\u001b[0m \u001b[0mafter\u001b[0m \u001b[0mthey\u001b[0m \u001b[0mare\u001b[0m \u001b[0mdone\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0mtheir\u001b[0m \u001b[0mpotential\u001b[0m \u001b[0mraises\u001b[0m\u001b[1;33m.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    221\u001b[0m         \"\"\"\n\u001b[1;32m--> 222\u001b[1;33m         self.handles = get_handle(\n\u001b[0m\u001b[0;32m    223\u001b[0m             \u001b[0msrc\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    224\u001b[0m             \u001b[1;34m\"r\"\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mc:\\anaconda\\lib\\site-packages\\pandas\\io\\common.py\u001b[0m in \u001b[0;36mget_handle\u001b[1;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[0;32m    700\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mioargs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mencoding\u001b[0m \u001b[1;32mand\u001b[0m \u001b[1;34m\"b\"\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mioargs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmode\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    701\u001b[0m             \u001b[1;31m# Encoding\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 702\u001b[1;33m             handle = open(\n\u001b[0m\u001b[0;32m    703\u001b[0m                 \u001b[0mhandle\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    704\u001b[0m                 \u001b[0mioargs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmode\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: './stocktest/stock600848.csv'"
     ]
    }
   ],
   "source": [
    "data=pd.read_csv(\"./stocktest/stock600848.csv\",parse_dates=[\"trade_date\"],index_col=[\"trade_date\"])\n",
    "data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    1.0\n",
       "1    3.0\n",
       "2    5.0\n",
       "3    NaN\n",
       "4    6.0\n",
       "5    8.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s = pd.Series([1, 3, 5, np.nan, 6, 8])\n",
    "\n",
    "s\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04',\n",
       "               '2023-01-05', '2023-01-06', '2023-01-07'],\n",
       "              dtype='datetime64[ns]', freq='D')"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dates = pd.date_range(\"20230101\", periods=7)\n",
    "dates\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-01-01</th>\n",
       "      <td>-0.422142</td>\n",
       "      <td>-0.947927</td>\n",
       "      <td>0.658353</td>\n",
       "      <td>0.315592</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-02</th>\n",
       "      <td>1.490495</td>\n",
       "      <td>0.338975</td>\n",
       "      <td>-0.493701</td>\n",
       "      <td>1.976673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-03</th>\n",
       "      <td>0.349343</td>\n",
       "      <td>1.525632</td>\n",
       "      <td>-0.950535</td>\n",
       "      <td>2.643914</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-04</th>\n",
       "      <td>-0.304986</td>\n",
       "      <td>0.577381</td>\n",
       "      <td>-2.347676</td>\n",
       "      <td>-0.557831</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-05</th>\n",
       "      <td>0.678568</td>\n",
       "      <td>-1.197278</td>\n",
       "      <td>0.631877</td>\n",
       "      <td>-0.110121</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-06</th>\n",
       "      <td>0.905947</td>\n",
       "      <td>-0.269014</td>\n",
       "      <td>0.357846</td>\n",
       "      <td>1.386100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-07</th>\n",
       "      <td>-1.194809</td>\n",
       "      <td>-0.321687</td>\n",
       "      <td>1.049912</td>\n",
       "      <td>2.504186</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B         C         D\n",
       "2023-01-01 -0.422142 -0.947927  0.658353  0.315592\n",
       "2023-01-02  1.490495  0.338975 -0.493701  1.976673\n",
       "2023-01-03  0.349343  1.525632 -0.950535  2.643914\n",
       "2023-01-04 -0.304986  0.577381 -2.347676 -0.557831\n",
       "2023-01-05  0.678568 -1.197278  0.631877 -0.110121\n",
       "2023-01-06  0.905947 -0.269014  0.357846  1.386100\n",
       "2023-01-07 -1.194809 -0.321687  1.049912  2.504186"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(np.random.randn(7, 4), index=dates, columns=list(\"ABCD\"))\n",
    "\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "      <th>F</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2013-01-02</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3</td>\n",
       "      <td>test</td>\n",
       "      <td>foo</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2013-01-02</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3</td>\n",
       "      <td>train</td>\n",
       "      <td>foo</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2013-01-02</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3</td>\n",
       "      <td>test</td>\n",
       "      <td>foo</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2013-01-02</td>\n",
       "      <td>1.0</td>\n",
       "      <td>3</td>\n",
       "      <td>train</td>\n",
       "      <td>foo</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A          B    C  D      E    F\n",
       "0  1.0 2013-01-02  1.0  3   test  foo\n",
       "1  1.0 2013-01-02  1.0  3  train  foo\n",
       "2  1.0 2013-01-02  1.0  3   test  foo\n",
       "3  1.0 2013-01-02  1.0  3  train  foo"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2 = pd.DataFrame(\n",
    "    {\n",
    "        \"A\": 1.0,\n",
    "        \"B\": pd.Timestamp(\"20130102\"),\n",
    "        \"C\": pd.Series(1, index=list(range(4)), dtype=\"float32\"),\n",
    "        \"D\": np.array([3] * 4, dtype=\"int32\"),\n",
    "        \"E\": pd.Categorical([\"test\", \"train\", \"test\", \"train\"]),\n",
    "        \"F\": \"foo\",\n",
    "    }\n",
    ")\n",
    "df2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A           float64\n",
       "B    datetime64[ns]\n",
       "C           float32\n",
       "D             int32\n",
       "E          category\n",
       "F            object\n",
       "dtype: object"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2.dtypes\n",
    "\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If you’re using IPython, tab completion for column names (as well as public attributes) is automatically enabled. Here’s a subset of the attributes that will be completed:\n",
    "df2. < TAB >  # noqa: E225, E999\n",
    "df2.A                  df2.bool\n",
    "df2.abs                df2.boxplot\n",
    "df2.add                df2.C\n",
    "df2.add_prefix         df2.clip\n",
    "df2.add_suffix         df2.columns\n",
    "df2.align              df2.copy\n",
    "df2.all                df2.count\n",
    "df2.any                df2.combine\n",
    "df2.append             df2.D\n",
    "df2.apply              df2.describe\n",
    "df2.applymap           df2.diff\n",
    "df2.B                  df2.duplicated\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Viewing data   \n",
    "See the Basics section.\n",
    "\n",
    "Use DataFrame.head() and DataFrame.tail() to view the top and bottom rows of the frame   \n",
    "respectively:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['A', 'B', 'C', 'D'], dtype='object')"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()\n",
    "df.tail(3)\n",
    "df.index\n",
    "df.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.42214198, -0.94792673,  0.65835252,  0.31559246],\n",
       "       [ 1.49049489,  0.33897487, -0.49370111,  1.97667342],\n",
       "       [ 0.34934318,  1.5256316 , -0.9505352 ,  2.64391359],\n",
       "       [-0.30498646,  0.57738051, -2.34767561, -0.55783101],\n",
       "       [ 0.67856755, -1.19727783,  0.63187727, -0.11012116],\n",
       "       [ 0.90594675, -0.26901423,  0.35784578,  1.38610027],\n",
       "       [-1.19480915, -0.3216872 ,  1.04991227,  2.50418576]])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.to_numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'],\n",
       "       [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo'],\n",
       "       [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'test', 'foo'],\n",
       "       [1.0, Timestamp('2013-01-02 00:00:00'), 1.0, 3, 'train', 'foo']],\n",
       "      dtype=object)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2.to_numpy()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>7.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>7.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>0.214631</td>\n",
       "      <td>-0.041988</td>\n",
       "      <td>-0.156275</td>\n",
       "      <td>1.165502</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.912974</td>\n",
       "      <td>0.937317</td>\n",
       "      <td>1.193800</td>\n",
       "      <td>1.291245</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>-1.194809</td>\n",
       "      <td>-1.197278</td>\n",
       "      <td>-2.347676</td>\n",
       "      <td>-0.557831</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>-0.363564</td>\n",
       "      <td>-0.634807</td>\n",
       "      <td>-0.722118</td>\n",
       "      <td>0.102736</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>0.349343</td>\n",
       "      <td>-0.269014</td>\n",
       "      <td>0.357846</td>\n",
       "      <td>1.386100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>0.792257</td>\n",
       "      <td>0.458178</td>\n",
       "      <td>0.645115</td>\n",
       "      <td>2.240430</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>1.490495</td>\n",
       "      <td>1.525632</td>\n",
       "      <td>1.049912</td>\n",
       "      <td>2.643914</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              A         B         C         D\n",
       "count  7.000000  7.000000  7.000000  7.000000\n",
       "mean   0.214631 -0.041988 -0.156275  1.165502\n",
       "std    0.912974  0.937317  1.193800  1.291245\n",
       "min   -1.194809 -1.197278 -2.347676 -0.557831\n",
       "25%   -0.363564 -0.634807 -0.722118  0.102736\n",
       "50%    0.349343 -0.269014  0.357846  1.386100\n",
       "75%    0.792257  0.458178  0.645115  2.240430\n",
       "max    1.490495  1.525632  1.049912  2.643914"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>2023-01-01</th>\n",
       "      <th>2023-01-02</th>\n",
       "      <th>2023-01-03</th>\n",
       "      <th>2023-01-04</th>\n",
       "      <th>2023-01-05</th>\n",
       "      <th>2023-01-06</th>\n",
       "      <th>2023-01-07</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>A</th>\n",
       "      <td>-0.422142</td>\n",
       "      <td>1.490495</td>\n",
       "      <td>0.349343</td>\n",
       "      <td>-0.304986</td>\n",
       "      <td>0.678568</td>\n",
       "      <td>0.905947</td>\n",
       "      <td>-1.194809</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>B</th>\n",
       "      <td>-0.947927</td>\n",
       "      <td>0.338975</td>\n",
       "      <td>1.525632</td>\n",
       "      <td>0.577381</td>\n",
       "      <td>-1.197278</td>\n",
       "      <td>-0.269014</td>\n",
       "      <td>-0.321687</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>C</th>\n",
       "      <td>0.658353</td>\n",
       "      <td>-0.493701</td>\n",
       "      <td>-0.950535</td>\n",
       "      <td>-2.347676</td>\n",
       "      <td>0.631877</td>\n",
       "      <td>0.357846</td>\n",
       "      <td>1.049912</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>D</th>\n",
       "      <td>0.315592</td>\n",
       "      <td>1.976673</td>\n",
       "      <td>2.643914</td>\n",
       "      <td>-0.557831</td>\n",
       "      <td>-0.110121</td>\n",
       "      <td>1.386100</td>\n",
       "      <td>2.504186</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   2023-01-01  2023-01-02  2023-01-03  2023-01-04  2023-01-05  2023-01-06  \\\n",
       "A   -0.422142    1.490495    0.349343   -0.304986    0.678568    0.905947   \n",
       "B   -0.947927    0.338975    1.525632    0.577381   -1.197278   -0.269014   \n",
       "C    0.658353   -0.493701   -0.950535   -2.347676    0.631877    0.357846   \n",
       "D    0.315592    1.976673    2.643914   -0.557831   -0.110121    1.386100   \n",
       "\n",
       "   2023-01-07  \n",
       "A   -1.194809  \n",
       "B   -0.321687  \n",
       "C    1.049912  \n",
       "D    2.504186  "
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>D</th>\n",
       "      <th>C</th>\n",
       "      <th>B</th>\n",
       "      <th>A</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-01-01</th>\n",
       "      <td>0.315592</td>\n",
       "      <td>0.658353</td>\n",
       "      <td>-0.947927</td>\n",
       "      <td>-0.422142</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-02</th>\n",
       "      <td>1.976673</td>\n",
       "      <td>-0.493701</td>\n",
       "      <td>0.338975</td>\n",
       "      <td>1.490495</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-03</th>\n",
       "      <td>2.643914</td>\n",
       "      <td>-0.950535</td>\n",
       "      <td>1.525632</td>\n",
       "      <td>0.349343</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-04</th>\n",
       "      <td>-0.557831</td>\n",
       "      <td>-2.347676</td>\n",
       "      <td>0.577381</td>\n",
       "      <td>-0.304986</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-05</th>\n",
       "      <td>-0.110121</td>\n",
       "      <td>0.631877</td>\n",
       "      <td>-1.197278</td>\n",
       "      <td>0.678568</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-06</th>\n",
       "      <td>1.386100</td>\n",
       "      <td>0.357846</td>\n",
       "      <td>-0.269014</td>\n",
       "      <td>0.905947</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-07</th>\n",
       "      <td>2.504186</td>\n",
       "      <td>1.049912</td>\n",
       "      <td>-0.321687</td>\n",
       "      <td>-1.194809</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   D         C         B         A\n",
       "2023-01-01  0.315592  0.658353 -0.947927 -0.422142\n",
       "2023-01-02  1.976673 -0.493701  0.338975  1.490495\n",
       "2023-01-03  2.643914 -0.950535  1.525632  0.349343\n",
       "2023-01-04 -0.557831 -2.347676  0.577381 -0.304986\n",
       "2023-01-05 -0.110121  0.631877 -1.197278  0.678568\n",
       "2023-01-06  1.386100  0.357846 -0.269014  0.905947\n",
       "2023-01-07  2.504186  1.049912 -0.321687 -1.194809"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sort_index(axis=1,ascending=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-01-05</th>\n",
       "      <td>0.678568</td>\n",
       "      <td>-1.197278</td>\n",
       "      <td>0.631877</td>\n",
       "      <td>-0.110121</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-01</th>\n",
       "      <td>-0.422142</td>\n",
       "      <td>-0.947927</td>\n",
       "      <td>0.658353</td>\n",
       "      <td>0.315592</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-07</th>\n",
       "      <td>-1.194809</td>\n",
       "      <td>-0.321687</td>\n",
       "      <td>1.049912</td>\n",
       "      <td>2.504186</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-06</th>\n",
       "      <td>0.905947</td>\n",
       "      <td>-0.269014</td>\n",
       "      <td>0.357846</td>\n",
       "      <td>1.386100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-02</th>\n",
       "      <td>1.490495</td>\n",
       "      <td>0.338975</td>\n",
       "      <td>-0.493701</td>\n",
       "      <td>1.976673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-04</th>\n",
       "      <td>-0.304986</td>\n",
       "      <td>0.577381</td>\n",
       "      <td>-2.347676</td>\n",
       "      <td>-0.557831</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-03</th>\n",
       "      <td>0.349343</td>\n",
       "      <td>1.525632</td>\n",
       "      <td>-0.950535</td>\n",
       "      <td>2.643914</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B         C         D\n",
       "2023-01-05  0.678568 -1.197278  0.631877 -0.110121\n",
       "2023-01-01 -0.422142 -0.947927  0.658353  0.315592\n",
       "2023-01-07 -1.194809 -0.321687  1.049912  2.504186\n",
       "2023-01-06  0.905947 -0.269014  0.357846  1.386100\n",
       "2023-01-02  1.490495  0.338975 -0.493701  1.976673\n",
       "2023-01-04 -0.304986  0.577381 -2.347676 -0.557831\n",
       "2023-01-03  0.349343  1.525632 -0.950535  2.643914"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sort_values(by=\"B\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Selection\n",
    "Note\n",
    "\n",
    "While standard Python / NumPy expressions for selecting and setting are intuitive and come in handy for interactive work, for production code, we recommend the optimized pandas data access methods, DataFrame.at(), DataFrame.iat(), DataFrame.loc() and DataFrame.iloc().\n",
    "\n",
    "See the indexing documentation Indexing and Selecting Data and MultiIndex / Advanced Indexing.\n",
    "\n",
    "#### Getting\n",
    "Selecting a single column, which yields a Series, equivalent to df.A:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04',\n",
       "               '2023-01-05', '2023-01-06', '2023-01-07'],\n",
       "              dtype='datetime64[ns]', freq='D')"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"A\"]\n",
    "df.index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-01-01</th>\n",
       "      <td>-0.422142</td>\n",
       "      <td>-0.947927</td>\n",
       "      <td>0.658353</td>\n",
       "      <td>0.315592</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-02</th>\n",
       "      <td>1.490495</td>\n",
       "      <td>0.338975</td>\n",
       "      <td>-0.493701</td>\n",
       "      <td>1.976673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-03</th>\n",
       "      <td>0.349343</td>\n",
       "      <td>1.525632</td>\n",
       "      <td>-0.950535</td>\n",
       "      <td>2.643914</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B         C         D\n",
       "2023-01-01 -0.422142 -0.947927  0.658353  0.315592\n",
       "2023-01-02  1.490495  0.338975 -0.493701  1.976673\n",
       "2023-01-03  0.349343  1.525632 -0.950535  2.643914"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[0:3]"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Selection by label\n",
    "See more in Selection by Label using DataFrame.loc() or DataFrame.at().\n",
    "\n",
    "For getting a cross section using a label:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A   -0.422142\n",
       "B   -0.947927\n",
       "C    0.658353\n",
       "D    0.315592\n",
       "Name: 2023-01-01 00:00:00, dtype: float64"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc[dates[0]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-01-01</th>\n",
       "      <td>-0.422142</td>\n",
       "      <td>-0.947927</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-02</th>\n",
       "      <td>1.490495</td>\n",
       "      <td>0.338975</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-03</th>\n",
       "      <td>0.349343</td>\n",
       "      <td>1.525632</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-04</th>\n",
       "      <td>-0.304986</td>\n",
       "      <td>0.577381</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-05</th>\n",
       "      <td>0.678568</td>\n",
       "      <td>-1.197278</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-06</th>\n",
       "      <td>0.905947</td>\n",
       "      <td>-0.269014</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-07</th>\n",
       "      <td>-1.194809</td>\n",
       "      <td>-0.321687</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B\n",
       "2023-01-01 -0.422142 -0.947927\n",
       "2023-01-02  1.490495  0.338975\n",
       "2023-01-03  0.349343  1.525632\n",
       "2023-01-04 -0.304986  0.577381\n",
       "2023-01-05  0.678568 -1.197278\n",
       "2023-01-06  0.905947 -0.269014\n",
       "2023-01-07 -1.194809 -0.321687"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc[:,[\"A\",\"B\"]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [A, B]\n",
       "Index: []"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc[\"20130102\":\"20130104\", [\"A\", \"B\"]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A    1.011881\n",
       "B   -1.467853\n",
       "Name: 2013-01-02 00:00:00, dtype: float64"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.loc[\"20130102\", [\"A\", \"B\"]]\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.3531243539756235"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.at[dates[0], \"A\"]\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Selection by position\n",
    "See more in Selection by Position using DataFrame.iloc() or DataFrame.at().\n",
    "\n",
    "Select via the position of the passed integers:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A   -0.471901\n",
       "B   -0.362371\n",
       "C   -1.663361\n",
       "D    0.417683\n",
       "Name: 2013-01-04 00:00:00, dtype: float64"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2013-01-04</th>\n",
       "      <td>-0.471901</td>\n",
       "      <td>-0.362371</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-05</th>\n",
       "      <td>-0.785147</td>\n",
       "      <td>2.458449</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B\n",
       "2013-01-04 -0.471901 -0.362371\n",
       "2013-01-05 -0.785147  2.458449"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[3:5,0:2]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>C</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2013-01-02</th>\n",
       "      <td>1.011881</td>\n",
       "      <td>0.984630</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-03</th>\n",
       "      <td>-0.021260</td>\n",
       "      <td>0.094271</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-05</th>\n",
       "      <td>-0.785147</td>\n",
       "      <td>0.060556</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         C\n",
       "2013-01-02  1.011881  0.984630\n",
       "2013-01-03 -0.021260  0.094271\n",
       "2013-01-05 -0.785147  0.060556"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[[1, 2, 4], [0, 2]]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2013-01-02</th>\n",
       "      <td>1.011881</td>\n",
       "      <td>-1.467853</td>\n",
       "      <td>0.984630</td>\n",
       "      <td>-1.423896</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-03</th>\n",
       "      <td>-0.021260</td>\n",
       "      <td>-0.387072</td>\n",
       "      <td>0.094271</td>\n",
       "      <td>0.830802</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B         C         D\n",
       "2013-01-02  1.011881 -1.467853  0.984630 -1.423896\n",
       "2013-01-03 -0.021260 -0.387072  0.094271  0.830802"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[1:3, :]\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For getting a value explicitly:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-1.4678527958278718"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iloc[1,1]"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For getting fast access to a scalar (equivalent to the prior method):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-1.4678527958278718"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.iat[1,1]"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Boolean indexing   \n",
    "Using a single column’s values to select data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2013-01-01</th>\n",
       "      <td>0.353124</td>\n",
       "      <td>-0.952107</td>\n",
       "      <td>-0.810359</td>\n",
       "      <td>0.319397</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-02</th>\n",
       "      <td>1.011881</td>\n",
       "      <td>-1.467853</td>\n",
       "      <td>0.984630</td>\n",
       "      <td>-1.423896</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-06</th>\n",
       "      <td>0.894152</td>\n",
       "      <td>0.082539</td>\n",
       "      <td>0.198704</td>\n",
       "      <td>1.096456</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B         C         D\n",
       "2013-01-01  0.353124 -0.952107 -0.810359  0.319397\n",
       "2013-01-02  1.011881 -1.467853  0.984630 -1.423896\n",
       "2013-01-06  0.894152  0.082539  0.198704  1.096456"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df[\"A\"]>0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2013-01-01</th>\n",
       "      <td>0.353124</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.319397</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-02</th>\n",
       "      <td>1.011881</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.984630</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-03</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.094271</td>\n",
       "      <td>0.830802</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-04</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.417683</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-05</th>\n",
       "      <td>NaN</td>\n",
       "      <td>2.458449</td>\n",
       "      <td>0.060556</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-06</th>\n",
       "      <td>0.894152</td>\n",
       "      <td>0.082539</td>\n",
       "      <td>0.198704</td>\n",
       "      <td>1.096456</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B         C         D\n",
       "2013-01-01  0.353124       NaN       NaN  0.319397\n",
       "2013-01-02  1.011881       NaN  0.984630       NaN\n",
       "2013-01-03       NaN       NaN  0.094271  0.830802\n",
       "2013-01-04       NaN       NaN       NaN  0.417683\n",
       "2013-01-05       NaN  2.458449  0.060556       NaN\n",
       "2013-01-06  0.894152  0.082539  0.198704  1.096456"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df > 0]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2013-01-01</th>\n",
       "      <td>0.353124</td>\n",
       "      <td>-0.952107</td>\n",
       "      <td>-0.810359</td>\n",
       "      <td>0.319397</td>\n",
       "      <td>one</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-02</th>\n",
       "      <td>1.011881</td>\n",
       "      <td>-1.467853</td>\n",
       "      <td>0.984630</td>\n",
       "      <td>-1.423896</td>\n",
       "      <td>one</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-03</th>\n",
       "      <td>-0.021260</td>\n",
       "      <td>-0.387072</td>\n",
       "      <td>0.094271</td>\n",
       "      <td>0.830802</td>\n",
       "      <td>two</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-04</th>\n",
       "      <td>-0.471901</td>\n",
       "      <td>-0.362371</td>\n",
       "      <td>-1.663361</td>\n",
       "      <td>0.417683</td>\n",
       "      <td>three</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-05</th>\n",
       "      <td>-0.785147</td>\n",
       "      <td>2.458449</td>\n",
       "      <td>0.060556</td>\n",
       "      <td>-0.461612</td>\n",
       "      <td>four</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-06</th>\n",
       "      <td>0.894152</td>\n",
       "      <td>0.082539</td>\n",
       "      <td>0.198704</td>\n",
       "      <td>1.096456</td>\n",
       "      <td>three</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B         C         D      E\n",
       "2013-01-01  0.353124 -0.952107 -0.810359  0.319397    one\n",
       "2013-01-02  1.011881 -1.467853  0.984630 -1.423896    one\n",
       "2013-01-03 -0.021260 -0.387072  0.094271  0.830802    two\n",
       "2013-01-04 -0.471901 -0.362371 -1.663361  0.417683  three\n",
       "2013-01-05 -0.785147  2.458449  0.060556 -0.461612   four\n",
       "2013-01-06  0.894152  0.082539  0.198704  1.096456  three"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2 = df.copy()\n",
    "\n",
    "df2[\"E\"] = [\"one\", \"one\", \"two\", \"three\", \"four\", \"three\"]\n",
    "\n",
    "df2\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Setting   \n",
    "Setting a new column automatically aligns the data by the indexes:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2013-01-02    1\n",
       "2013-01-03    2\n",
       "2013-01-04    3\n",
       "2013-01-05    4\n",
       "2013-01-06    5\n",
       "2013-01-07    6\n",
       "Freq: D, dtype: int64"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s1 = pd.Series([1, 2, 3, 4, 5, 6], index=pd.date_range(\"20130102\", periods=6))\n",
    "\n",
    "s1\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "df[\"F\"] = s1\n",
    "\n",
    "df.at[dates[0], \"A\"] = 0\n",
    "df.iat[0, 1] = 0\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.loc[:, \"D\"] = np.array([5] * len(df))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>F</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-01-01</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-1.395575</td>\n",
       "      <td>-5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-02</th>\n",
       "      <td>-0.155978</td>\n",
       "      <td>-0.080900</td>\n",
       "      <td>-1.696491</td>\n",
       "      <td>-5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-03</th>\n",
       "      <td>-1.577167</td>\n",
       "      <td>-0.298967</td>\n",
       "      <td>-1.121329</td>\n",
       "      <td>-5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-04</th>\n",
       "      <td>-0.814141</td>\n",
       "      <td>-1.501626</td>\n",
       "      <td>-0.565572</td>\n",
       "      <td>-5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-05</th>\n",
       "      <td>-0.630962</td>\n",
       "      <td>-2.465135</td>\n",
       "      <td>-1.939988</td>\n",
       "      <td>-5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-06</th>\n",
       "      <td>-0.011362</td>\n",
       "      <td>-0.128506</td>\n",
       "      <td>-0.968129</td>\n",
       "      <td>-5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-07</th>\n",
       "      <td>-0.304805</td>\n",
       "      <td>-1.658436</td>\n",
       "      <td>-0.052668</td>\n",
       "      <td>-5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B         C  D   F\n",
       "2023-01-01  0.000000  0.000000 -1.395575 -5 NaN\n",
       "2023-01-02 -0.155978 -0.080900 -1.696491 -5 NaN\n",
       "2023-01-03 -1.577167 -0.298967 -1.121329 -5 NaN\n",
       "2023-01-04 -0.814141 -1.501626 -0.565572 -5 NaN\n",
       "2023-01-05 -0.630962 -2.465135 -1.939988 -5 NaN\n",
       "2023-01-06 -0.011362 -0.128506 -0.968129 -5 NaN\n",
       "2023-01-07 -0.304805 -1.658436 -0.052668 -5 NaN"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2 = df.copy()\n",
    "\n",
    "df2[df2 > 0] = -df2\n",
    "\n",
    "df2\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Missing data   \n",
    "pandas primarily uses the value np.nan to represent missing data. It is by default not included in computations. See the Missing Data section.\n",
    "\n",
    "Reindexing allows you to change/add/delete the index on a specified axis. This returns a copy of the data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>F</th>\n",
       "      <th>E</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-01-01</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-1.395575</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-02</th>\n",
       "      <td>-0.155978</td>\n",
       "      <td>-0.080900</td>\n",
       "      <td>1.696491</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-03</th>\n",
       "      <td>1.577167</td>\n",
       "      <td>0.298967</td>\n",
       "      <td>1.121329</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-04</th>\n",
       "      <td>-0.814141</td>\n",
       "      <td>-1.501626</td>\n",
       "      <td>0.565572</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B         C  D   F    E\n",
       "2023-01-01  0.000000  0.000000 -1.395575  5 NaN  1.0\n",
       "2023-01-02 -0.155978 -0.080900  1.696491  5 NaN  1.0\n",
       "2023-01-03  1.577167  0.298967  1.121329  5 NaN  NaN\n",
       "2023-01-04 -0.814141 -1.501626  0.565572  5 NaN  NaN"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + [\"E\"])\n",
    "\n",
    "df1.loc[dates[0]: dates[1], \"E\"] = 1\n",
    "\n",
    "df1\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>F</th>\n",
       "      <th>E</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "Empty DataFrame\n",
       "Columns: [A, B, C, D, F, E]\n",
       "Index: []"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.dropna(how=\"any\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>F</th>\n",
       "      <th>E</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-01-01</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-1.395575</td>\n",
       "      <td>5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-02</th>\n",
       "      <td>-0.155978</td>\n",
       "      <td>-0.080900</td>\n",
       "      <td>1.696491</td>\n",
       "      <td>5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-03</th>\n",
       "      <td>1.577167</td>\n",
       "      <td>0.298967</td>\n",
       "      <td>1.121329</td>\n",
       "      <td>5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-04</th>\n",
       "      <td>-0.814141</td>\n",
       "      <td>-1.501626</td>\n",
       "      <td>0.565572</td>\n",
       "      <td>5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B         C  D    F    E\n",
       "2023-01-01  0.000000  0.000000 -1.395575  5  0.0  1.0\n",
       "2023-01-02 -0.155978 -0.080900  1.696491  5  0.0  1.0\n",
       "2023-01-03  1.577167  0.298967  1.121329  5  0.0  0.0\n",
       "2023-01-04 -0.814141 -1.501626  0.565572  5  0.0  0.0"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1.fillna(value=0)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>F</th>\n",
       "      <th>E</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2023-01-01</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-02</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-03</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2023-01-04</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                A      B      C      D     F      E\n",
       "2023-01-01  False  False  False  False  True  False\n",
       "2023-01-02  False  False  False  False  True  False\n",
       "2023-01-03  False  False  False  False  True   True\n",
       "2023-01-04  False  False  False  False  True   True"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.isna(df1)\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Operations   \n",
    "See the Basic section on Binary Ops.\n",
    "\n",
    "#### Stats   \n",
    "Operations in general exclude missing data.\n",
    "\n",
    "Performing a descriptive statistic:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A    0.222025\n",
       "B   -0.086481\n",
       "C    0.415287\n",
       "D    5.000000\n",
       "F         NaN\n",
       "dtype: float64"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.mean()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2023-01-01    0.901106\n",
       "2023-01-02    1.614903\n",
       "2023-01-03    1.999366\n",
       "2023-01-04    0.812451\n",
       "2023-01-05    2.509021\n",
       "2023-01-06    0.978682\n",
       "2023-01-07    0.898425\n",
       "Freq: D, dtype: float64"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.mean(1)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Operating with objects that have different dimensionality and need alignment. In addition, pandas automatically broadcasts along the specified dimension:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2013-01-01    NaN\n",
       "2013-01-02    NaN\n",
       "2013-01-03    1.0\n",
       "2013-01-04    3.0\n",
       "2013-01-05    5.0\n",
       "2013-01-06    NaN\n",
       "Freq: D, dtype: float64"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s=pd.Series([1, 3, 5, np.nan, 6, 8], index=dates).shift(2)\n",
    "s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>F</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2013-01-01</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-02</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-03</th>\n",
       "      <td>-1.021260</td>\n",
       "      <td>-1.387072</td>\n",
       "      <td>-0.905729</td>\n",
       "      <td>4.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-04</th>\n",
       "      <td>-3.471901</td>\n",
       "      <td>-3.362371</td>\n",
       "      <td>-4.663361</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-05</th>\n",
       "      <td>-5.785147</td>\n",
       "      <td>-2.541551</td>\n",
       "      <td>-4.939444</td>\n",
       "      <td>0.0</td>\n",
       "      <td>-1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-06</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B         C    D    F\n",
       "2013-01-01       NaN       NaN       NaN  NaN  NaN\n",
       "2013-01-02       NaN       NaN       NaN  NaN  NaN\n",
       "2013-01-03 -1.021260 -1.387072 -0.905729  4.0  1.0\n",
       "2013-01-04 -3.471901 -3.362371 -4.663361  2.0  0.0\n",
       "2013-01-05 -5.785147 -2.541551 -4.939444  0.0 -1.0\n",
       "2013-01-06       NaN       NaN       NaN  NaN  NaN"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sub(s, axis=\"index\")\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Apply   \n",
    "DataFrame.apply() applies a user defined function to the data:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>F</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2013-01-01</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-0.810359</td>\n",
       "      <td>5</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-02</th>\n",
       "      <td>1.011881</td>\n",
       "      <td>-1.467853</td>\n",
       "      <td>0.174271</td>\n",
       "      <td>10</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-03</th>\n",
       "      <td>0.990621</td>\n",
       "      <td>-1.854924</td>\n",
       "      <td>0.268541</td>\n",
       "      <td>15</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-04</th>\n",
       "      <td>0.518720</td>\n",
       "      <td>-2.217296</td>\n",
       "      <td>-1.394820</td>\n",
       "      <td>20</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-05</th>\n",
       "      <td>-0.266427</td>\n",
       "      <td>0.241153</td>\n",
       "      <td>-1.334264</td>\n",
       "      <td>25</td>\n",
       "      <td>10.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2013-01-06</th>\n",
       "      <td>0.627724</td>\n",
       "      <td>0.323692</td>\n",
       "      <td>-1.135561</td>\n",
       "      <td>30</td>\n",
       "      <td>15.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                   A         B         C   D     F\n",
       "2013-01-01  0.000000  0.000000 -0.810359   5   NaN\n",
       "2013-01-02  1.011881 -1.467853  0.174271  10   1.0\n",
       "2013-01-03  0.990621 -1.854924  0.268541  15   3.0\n",
       "2013-01-04  0.518720 -2.217296 -1.394820  20   6.0\n",
       "2013-01-05 -0.266427  0.241153 -1.334264  25  10.0\n",
       "2013-01-06  0.627724  0.323692 -1.135561  30  15.0"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.apply(np.cumsum)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "A    1.797028\n",
       "B    3.926302\n",
       "C    2.647991\n",
       "D    0.000000\n",
       "F    4.000000\n",
       "dtype: float64"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.apply(lambda x: x.max() - x.min())\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Histogramming  \n",
    "See more at Histogramming and Discretization.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    4\n",
       "1    5\n",
       "2    0\n",
       "3    4\n",
       "4    3\n",
       "5    6\n",
       "6    3\n",
       "7    5\n",
       "8    0\n",
       "9    1\n",
       "dtype: int32"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s = pd.Series(np.random.randint(0, 7, size=10))\n",
    "\n",
    "s\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### String Methods   \n",
    "Series is equipped with a set of string processing methods in the str attribute that make it easy to operate on each element of the array, as in the code snippet below. Note that pattern-matching in str generally uses regular expressions by default (and in some cases always uses them). See more at Vectorized String Methods."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0       a\n",
       "1       b\n",
       "2       c\n",
       "3    aaba\n",
       "4    baca\n",
       "5     NaN\n",
       "6    caba\n",
       "7     dog\n",
       "8     cat\n",
       "dtype: object"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s = pd.Series([\"A\", \"B\", \"C\", \"Aaba\", \"Baca\", np.nan, \"CABA\", \"dog\", \"cat\"])\n",
    "\n",
    "s.str.lower()\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Merge   \n",
    "#### Concat   \n",
    "pandas provides various facilities for easily combining together Series and DataFrame objects with various kinds of set logic for the indexes and relational algebra functionality in the case of join / merge-type operations.\n",
    "\n",
    "See the Merging section.\n",
    "\n",
    "Concatenating pandas objects together along an axis with concat():"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.070919</td>\n",
       "      <td>-0.909621</td>\n",
       "      <td>-0.058982</td>\n",
       "      <td>1.065355</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.942190</td>\n",
       "      <td>2.307742</td>\n",
       "      <td>1.313294</td>\n",
       "      <td>0.904494</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.206415</td>\n",
       "      <td>-0.255212</td>\n",
       "      <td>0.415303</td>\n",
       "      <td>-0.665433</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.528560</td>\n",
       "      <td>-0.424218</td>\n",
       "      <td>-0.674206</td>\n",
       "      <td>0.179578</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.147629</td>\n",
       "      <td>1.593130</td>\n",
       "      <td>0.083113</td>\n",
       "      <td>-0.375661</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-0.067266</td>\n",
       "      <td>-0.636576</td>\n",
       "      <td>0.025570</td>\n",
       "      <td>0.808047</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>-0.480931</td>\n",
       "      <td>1.140837</td>\n",
       "      <td>0.408431</td>\n",
       "      <td>2.374829</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-0.035620</td>\n",
       "      <td>0.351948</td>\n",
       "      <td>1.159103</td>\n",
       "      <td>-1.073382</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-0.940397</td>\n",
       "      <td>0.636860</td>\n",
       "      <td>-0.273128</td>\n",
       "      <td>1.445847</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>-2.517698</td>\n",
       "      <td>-0.010000</td>\n",
       "      <td>-0.223322</td>\n",
       "      <td>0.710669</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          0         1         2         3\n",
       "0  1.070919 -0.909621 -0.058982  1.065355\n",
       "1  0.942190  2.307742  1.313294  0.904494\n",
       "2 -0.206415 -0.255212  0.415303 -0.665433\n",
       "3  0.528560 -0.424218 -0.674206  0.179578\n",
       "4 -1.147629  1.593130  0.083113 -0.375661\n",
       "5 -0.067266 -0.636576  0.025570  0.808047\n",
       "6 -0.480931  1.140837  0.408431  2.374829\n",
       "7 -0.035620  0.351948  1.159103 -1.073382\n",
       "8 -0.940397  0.636860 -0.273128  1.445847\n",
       "9 -2.517698 -0.010000 -0.223322  0.710669"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(np.random.randn(10, 4))\n",
    "\n",
    "df\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.070919</td>\n",
       "      <td>-0.909621</td>\n",
       "      <td>-0.058982</td>\n",
       "      <td>1.065355</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.942190</td>\n",
       "      <td>2.307742</td>\n",
       "      <td>1.313294</td>\n",
       "      <td>0.904494</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.206415</td>\n",
       "      <td>-0.255212</td>\n",
       "      <td>0.415303</td>\n",
       "      <td>-0.665433</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.528560</td>\n",
       "      <td>-0.424218</td>\n",
       "      <td>-0.674206</td>\n",
       "      <td>0.179578</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.147629</td>\n",
       "      <td>1.593130</td>\n",
       "      <td>0.083113</td>\n",
       "      <td>-0.375661</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>-0.067266</td>\n",
       "      <td>-0.636576</td>\n",
       "      <td>0.025570</td>\n",
       "      <td>0.808047</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>-0.480931</td>\n",
       "      <td>1.140837</td>\n",
       "      <td>0.408431</td>\n",
       "      <td>2.374829</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>-0.035620</td>\n",
       "      <td>0.351948</td>\n",
       "      <td>1.159103</td>\n",
       "      <td>-1.073382</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>-0.940397</td>\n",
       "      <td>0.636860</td>\n",
       "      <td>-0.273128</td>\n",
       "      <td>1.445847</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>-2.517698</td>\n",
       "      <td>-0.010000</td>\n",
       "      <td>-0.223322</td>\n",
       "      <td>0.710669</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          0         1         2         3\n",
       "0  1.070919 -0.909621 -0.058982  1.065355\n",
       "1  0.942190  2.307742  1.313294  0.904494\n",
       "2 -0.206415 -0.255212  0.415303 -0.665433\n",
       "3  0.528560 -0.424218 -0.674206  0.179578\n",
       "4 -1.147629  1.593130  0.083113 -0.375661\n",
       "5 -0.067266 -0.636576  0.025570  0.808047\n",
       "6 -0.480931  1.140837  0.408431  2.374829\n",
       "7 -0.035620  0.351948  1.159103 -1.073382\n",
       "8 -0.940397  0.636860 -0.273128  1.445847\n",
       "9 -2.517698 -0.010000 -0.223322  0.710669"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pieces = [df[:3], df[3:7], df[7:]]\n",
    "pd.concat(pieces)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note\n",
    "\n",
    "Adding a column to a DataFrame is relatively fast. However, adding a row requires a copy, and may be expensive. We recommend passing a pre-built list of records to the DataFrame constructor instead of building a DataFrame by iteratively appending records to it.\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Join \n",
    "merge() enables SQL style join types along specific columns. See the Database style joining section.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>key</th>\n",
       "      <th>lval</th>\n",
       "      <th>rval</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>foo</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>foo</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>foo</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>foo</td>\n",
       "      <td>2</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   key  lval  rval\n",
       "0  foo     1     4\n",
       "1  foo     1     5\n",
       "2  foo     2     4\n",
       "3  foo     2     5"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "left = pd.DataFrame({\"key\": [\"foo\", \"foo\"], \"lval\": [1, 2]})\n",
    "\n",
    "right = pd.DataFrame({\"key\": [\"foo\", \"foo\"], \"rval\": [4, 5]})\n",
    "pd.merge(left, right, on=\"key\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>key</th>\n",
       "      <th>lval</th>\n",
       "      <th>rval</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>foo</td>\n",
       "      <td>1</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>bar</td>\n",
       "      <td>2</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   key  lval  rval\n",
       "0  foo     1     4\n",
       "1  bar     2     5"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "left = pd.DataFrame({\"key\": [\"foo\", \"bar\"], \"lval\": [1, 2]})\n",
    "\n",
    "right = pd.DataFrame({\"key\": [\"foo\", \"bar\"], \"rval\": [4, 5]})\n",
    "pd.merge(left, right, on=\"key\")\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Grouping   \n",
    "By “group by” we are referring to a process involving one or more of the following steps:\n",
    "\n",
    "  >Splitting the data into groups based on some criteria\n",
    "\n",
    "  >Applying a function to each group independently\n",
    "\n",
    "  >Combining the results into a data structure\n",
    "\n",
    "See the Grouping section."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>foo</td>\n",
       "      <td>one</td>\n",
       "      <td>0.469626</td>\n",
       "      <td>-0.453533</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>bar</td>\n",
       "      <td>one</td>\n",
       "      <td>-0.528487</td>\n",
       "      <td>0.102063</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>foo</td>\n",
       "      <td>two</td>\n",
       "      <td>-0.165808</td>\n",
       "      <td>0.726964</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>bar</td>\n",
       "      <td>three</td>\n",
       "      <td>0.934137</td>\n",
       "      <td>2.426803</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>foo</td>\n",
       "      <td>two</td>\n",
       "      <td>0.775809</td>\n",
       "      <td>-0.393736</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>bar</td>\n",
       "      <td>two</td>\n",
       "      <td>0.792758</td>\n",
       "      <td>1.703328</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>foo</td>\n",
       "      <td>one</td>\n",
       "      <td>1.664355</td>\n",
       "      <td>-1.335949</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>foo</td>\n",
       "      <td>three</td>\n",
       "      <td>0.005753</td>\n",
       "      <td>0.520489</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     A      B         C         D\n",
       "0  foo    one  0.469626 -0.453533\n",
       "1  bar    one -0.528487  0.102063\n",
       "2  foo    two -0.165808  0.726964\n",
       "3  bar  three  0.934137  2.426803\n",
       "4  foo    two  0.775809 -0.393736\n",
       "5  bar    two  0.792758  1.703328\n",
       "6  foo    one  1.664355 -1.335949\n",
       "7  foo  three  0.005753  0.520489"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(\n",
    "    {\n",
    "        \"A\": [\"foo\", \"bar\", \"foo\", \"bar\", \"foo\", \"bar\", \"foo\", \"foo\"],\n",
    "        \"B\": [\"one\", \"one\", \"two\", \"three\", \"two\", \"two\", \"one\", \"three\"],\n",
    "        \"C\": np.random.randn(8),\n",
    "        \"D\": np.random.randn(8),\n",
    "    }\n",
    ")\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>A</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>bar</th>\n",
       "      <td>1.198408</td>\n",
       "      <td>4.232194</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>foo</th>\n",
       "      <td>2.749736</td>\n",
       "      <td>-0.935764</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            C         D\n",
       "A                      \n",
       "bar  1.198408  4.232194\n",
       "foo  2.749736 -0.935764"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby(\"A\")[[\"C\", \"D\"]].sum()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">bar</th>\n",
       "      <th>one</th>\n",
       "      <td>-0.528487</td>\n",
       "      <td>0.102063</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>three</th>\n",
       "      <td>0.934137</td>\n",
       "      <td>2.426803</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>two</th>\n",
       "      <td>0.792758</td>\n",
       "      <td>1.703328</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">foo</th>\n",
       "      <th>one</th>\n",
       "      <td>2.133982</td>\n",
       "      <td>-1.789481</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>three</th>\n",
       "      <td>0.005753</td>\n",
       "      <td>0.520489</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>two</th>\n",
       "      <td>0.610001</td>\n",
       "      <td>0.333228</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  C         D\n",
       "A   B                        \n",
       "bar one   -0.528487  0.102063\n",
       "    three  0.934137  2.426803\n",
       "    two    0.792758  1.703328\n",
       "foo one    2.133982 -1.789481\n",
       "    three  0.005753  0.520489\n",
       "    two    0.610001  0.333228"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby([\"A\", \"B\"]).sum()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Reshaping   \n",
    "See the sections on Hierarchical Indexing and Reshaping.\n",
    "\n",
    "Stack\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>first</th>\n",
       "      <th>second</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">bar</th>\n",
       "      <th>one</th>\n",
       "      <td>0.592387</td>\n",
       "      <td>0.720654</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>two</th>\n",
       "      <td>-0.240999</td>\n",
       "      <td>0.132012</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">baz</th>\n",
       "      <th>one</th>\n",
       "      <td>1.181864</td>\n",
       "      <td>0.469986</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>two</th>\n",
       "      <td>-1.677578</td>\n",
       "      <td>0.122411</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     A         B\n",
       "first second                    \n",
       "bar   one     0.592387  0.720654\n",
       "      two    -0.240999  0.132012\n",
       "baz   one     1.181864  0.469986\n",
       "      two    -1.677578  0.122411"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tuples = list(\n",
    "    zip(\n",
    "        [\"bar\", \"bar\", \"baz\", \"baz\", \"foo\", \"foo\", \"qux\", \"qux\"],\n",
    "        [\"one\", \"two\", \"one\", \"two\", \"one\", \"two\", \"one\", \"two\"],\n",
    "    )\n",
    ")\n",
    "\n",
    "\n",
    "index = pd.MultiIndex.from_tuples(tuples, names=[\"first\", \"second\"])\n",
    "\n",
    "df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=[\"A\", \"B\"])\n",
    "\n",
    "df2 = df[:4]\n",
    "\n",
    "df2\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "first  second   \n",
       "bar    one     A    0.592387\n",
       "               B    0.720654\n",
       "       two     A   -0.240999\n",
       "               B    0.132012\n",
       "baz    one     A    1.181864\n",
       "               B    0.469986\n",
       "       two     A   -1.677578\n",
       "               B    0.122411\n",
       "dtype: float64"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stacked = df2.stack()\n",
    "\n",
    "stacked\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>first</th>\n",
       "      <th>bar</th>\n",
       "      <th>baz</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>second</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">one</th>\n",
       "      <th>A</th>\n",
       "      <td>0.592387</td>\n",
       "      <td>1.181864</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>B</th>\n",
       "      <td>0.720654</td>\n",
       "      <td>0.469986</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"2\" valign=\"top\">two</th>\n",
       "      <th>A</th>\n",
       "      <td>-0.240999</td>\n",
       "      <td>-1.677578</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>B</th>\n",
       "      <td>0.132012</td>\n",
       "      <td>0.122411</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "first          bar       baz\n",
       "second                      \n",
       "one    A  0.592387  1.181864\n",
       "       B  0.720654  0.469986\n",
       "two    A -0.240999 -1.677578\n",
       "       B  0.132012  0.122411"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stacked.unstack()\n",
    "\n",
    "\n",
    "stacked.unstack(1)\n",
    "\n",
    "\n",
    "stacked.unstack(0)\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Pivot tables  \n",
    "See the section on Pivot Tables."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "      <th>E</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>one</td>\n",
       "      <td>A</td>\n",
       "      <td>foo</td>\n",
       "      <td>0.571207</td>\n",
       "      <td>0.443537</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>one</td>\n",
       "      <td>B</td>\n",
       "      <td>foo</td>\n",
       "      <td>0.059570</td>\n",
       "      <td>0.549866</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>two</td>\n",
       "      <td>C</td>\n",
       "      <td>foo</td>\n",
       "      <td>-0.327195</td>\n",
       "      <td>0.222671</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>three</td>\n",
       "      <td>A</td>\n",
       "      <td>bar</td>\n",
       "      <td>-0.142887</td>\n",
       "      <td>-0.280958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>one</td>\n",
       "      <td>B</td>\n",
       "      <td>bar</td>\n",
       "      <td>1.484399</td>\n",
       "      <td>0.341254</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>one</td>\n",
       "      <td>C</td>\n",
       "      <td>bar</td>\n",
       "      <td>0.657294</td>\n",
       "      <td>0.111515</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>two</td>\n",
       "      <td>A</td>\n",
       "      <td>foo</td>\n",
       "      <td>-1.309137</td>\n",
       "      <td>-1.301511</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>three</td>\n",
       "      <td>B</td>\n",
       "      <td>foo</td>\n",
       "      <td>-0.382706</td>\n",
       "      <td>0.322421</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>one</td>\n",
       "      <td>C</td>\n",
       "      <td>foo</td>\n",
       "      <td>-0.217702</td>\n",
       "      <td>0.702098</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>one</td>\n",
       "      <td>A</td>\n",
       "      <td>bar</td>\n",
       "      <td>-0.479563</td>\n",
       "      <td>-1.872191</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>two</td>\n",
       "      <td>B</td>\n",
       "      <td>bar</td>\n",
       "      <td>1.102865</td>\n",
       "      <td>-0.331685</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>three</td>\n",
       "      <td>C</td>\n",
       "      <td>bar</td>\n",
       "      <td>-0.626540</td>\n",
       "      <td>-0.590578</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        A  B    C         D         E\n",
       "0     one  A  foo  0.571207  0.443537\n",
       "1     one  B  foo  0.059570  0.549866\n",
       "2     two  C  foo -0.327195  0.222671\n",
       "3   three  A  bar -0.142887 -0.280958\n",
       "4     one  B  bar  1.484399  0.341254\n",
       "5     one  C  bar  0.657294  0.111515\n",
       "6     two  A  foo -1.309137 -1.301511\n",
       "7   three  B  foo -0.382706  0.322421\n",
       "8     one  C  foo -0.217702  0.702098\n",
       "9     one  A  bar -0.479563 -1.872191\n",
       "10    two  B  bar  1.102865 -0.331685\n",
       "11  three  C  bar -0.626540 -0.590578"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(\n",
    "    {\n",
    "        \"A\": [\"one\", \"one\", \"two\", \"three\"] * 3,\n",
    "        \"B\": [\"A\", \"B\", \"C\"] * 4,\n",
    "        \"C\": [\"foo\", \"foo\", \"foo\", \"bar\", \"bar\", \"bar\"] * 2,\n",
    "        \"D\": np.random.randn(12),\n",
    "        \"E\": np.random.randn(12),\n",
    "    }\n",
    ")\n",
    "\n",
    "\n",
    "df\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>C</th>\n",
       "      <th>bar</th>\n",
       "      <th>foo</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">one</th>\n",
       "      <th>A</th>\n",
       "      <td>-0.479563</td>\n",
       "      <td>0.571207</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>B</th>\n",
       "      <td>1.484399</td>\n",
       "      <td>0.059570</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>C</th>\n",
       "      <td>0.657294</td>\n",
       "      <td>-0.217702</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">three</th>\n",
       "      <th>A</th>\n",
       "      <td>-0.142887</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>B</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-0.382706</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>C</th>\n",
       "      <td>-0.626540</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th rowspan=\"3\" valign=\"top\">two</th>\n",
       "      <th>A</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-1.309137</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>B</th>\n",
       "      <td>1.102865</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>C</th>\n",
       "      <td>NaN</td>\n",
       "      <td>-0.327195</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "C             bar       foo\n",
       "A     B                    \n",
       "one   A -0.479563  0.571207\n",
       "      B  1.484399  0.059570\n",
       "      C  0.657294 -0.217702\n",
       "three A -0.142887       NaN\n",
       "      B       NaN -0.382706\n",
       "      C -0.626540       NaN\n",
       "two   A       NaN -1.309137\n",
       "      B  1.102865       NaN\n",
       "      C       NaN -0.327195"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.pivot_table(df, values=\"D\", index=[\"A\", \"B\"], columns=[\"C\"])\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Time series   \n",
    "pandas has simple, powerful, and efficient functionality for performing resampling operations during frequency conversion (e.g., converting secondly data into 5-minutely data). This is extremely common in, but not limited to, financial applications. See the Time Series section."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2012-01-01    29307\n",
       "Freq: 5T, dtype: int32"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rng = pd.date_range(\"1/1/2012\", periods=100, freq=\"S\")\n",
    "\n",
    "ts = pd.Series(np.random.randint(0, 550, len(rng)), index=rng)\n",
    "\n",
    "ts.resample(\"5Min\").sum()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Series.tz_localize() localizes a time series to a time zone:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2012-03-06   -1.069089\n",
       "2012-03-07   -0.231289\n",
       "2012-03-08   -0.710142\n",
       "2012-03-09   -0.830763\n",
       "2012-03-10    1.825935\n",
       "Freq: D, dtype: float64"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rng = pd.date_range(\"3/6/2012 00:00\", periods=5, freq=\"D\")\n",
    "\n",
    "ts = pd.Series(np.random.randn(len(rng)), rng)\n",
    "\n",
    "ts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2012-03-06 00:00:00+00:00   -1.069089\n",
       "2012-03-07 00:00:00+00:00   -0.231289\n",
       "2012-03-08 00:00:00+00:00   -0.710142\n",
       "2012-03-09 00:00:00+00:00   -0.830763\n",
       "2012-03-10 00:00:00+00:00    1.825935\n",
       "Freq: D, dtype: float64"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts_utc = ts.tz_localize(\"UTC\")\n",
    "\n",
    "ts_utc\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Series.tz_convert() converts a timezones aware time series to another time zone:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2012-03-05 19:00:00-05:00   -1.069089\n",
       "2012-03-06 19:00:00-05:00   -0.231289\n",
       "2012-03-07 19:00:00-05:00   -0.710142\n",
       "2012-03-08 19:00:00-05:00   -0.830763\n",
       "2012-03-09 19:00:00-05:00    1.825935\n",
       "Freq: D, dtype: float64"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ts_utc.tz_convert(\"US/Eastern\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Converting between time span representations:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2012-01-31    0.374555\n",
       "2012-02-29    0.033252\n",
       "2012-03-31    0.377800\n",
       "2012-04-30    0.121815\n",
       "2012-05-31   -0.552315\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rng = pd.date_range(\"1/1/2012\", periods=5, freq=\"M\")\n",
    "\n",
    "ts = pd.Series(np.random.randn(len(rng)), index=rng)\n",
    "\n",
    "ts\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2012-01    0.374555\n",
       "2012-02    0.033252\n",
       "2012-03    0.377800\n",
       "2012-04    0.121815\n",
       "2012-05   -0.552315\n",
       "Freq: M, dtype: float64"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ps = ts.to_period()\n",
    "\n",
    "ps\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2012-01-01    0.374555\n",
       "2012-02-01    0.033252\n",
       "2012-03-01    0.377800\n",
       "2012-04-01    0.121815\n",
       "2012-05-01   -0.552315\n",
       "Freq: MS, dtype: float64"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ps.to_timestamp()\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Categoricals   \n",
    "pandas can include categorical data in a DataFrame. For full docs, see the categorical introduction and the API documentation.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "pandas can include categorical data in a DataFrame. For full docs, see the categorical introduction and the API documentation.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>raw_grade</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>a</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>b</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>b</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>a</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>a</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>e</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id raw_grade\n",
       "0   1         a\n",
       "1   2         b\n",
       "2   3         b\n",
       "3   4         a\n",
       "4   5         a\n",
       "5   6         e"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.DataFrame(\n",
    "    {\"id\": [1, 2, 3, 4, 5, 6], \"raw_grade\": [\"a\", \"b\", \"b\", \"a\", \"a\", \"e\"]}\n",
    ")\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Rename the categories to more meaningful names:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    a\n",
       "1    b\n",
       "2    b\n",
       "3    a\n",
       "4    a\n",
       "5    e\n",
       "Name: grade, dtype: category\n",
       "Categories (3, object): ['a', 'b', 'e']"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"grade\"] = df[\"raw_grade\"].astype(\"category\")\n",
    "\n",
    "df[\"grade\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [],
   "source": [
    "new_categories = [\"very good\", \"good\", \"very bad\"]\n",
    "\n",
    "df[\"grade\"] = df[\"grade\"].cat.rename_categories(new_categories)\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Reorder the categories and simultaneously add the missing categories (methods under Series.cat() return a new Series by default):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    very good\n",
       "1         good\n",
       "2         good\n",
       "3    very good\n",
       "4    very good\n",
       "5     very bad\n",
       "Name: grade, dtype: category\n",
       "Categories (5, object): ['very bad', 'bad', 'medium', 'good', 'very good']"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[\"grade\"] = df[\"grade\"].cat.set_categories(\n",
    "    [\"very bad\", \"bad\", \"medium\", \"good\", \"very good\"]\n",
    ")\n",
    "\n",
    "\n",
    "df[\"grade\"]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>raw_grade</th>\n",
       "      <th>grade</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>e</td>\n",
       "      <td>very bad</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>b</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>b</td>\n",
       "      <td>good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>a</td>\n",
       "      <td>very good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>a</td>\n",
       "      <td>very good</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>a</td>\n",
       "      <td>very good</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id raw_grade      grade\n",
       "5   6         e   very bad\n",
       "1   2         b       good\n",
       "2   3         b       good\n",
       "0   1         a  very good\n",
       "3   4         a  very good\n",
       "4   5         a  very good"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.sort_values(by=\"grade\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "grade\n",
       "very bad     1\n",
       "bad          0\n",
       "medium       0\n",
       "good         2\n",
       "very good    3\n",
       "dtype: int64"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.groupby(\"grade\").size()\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plotting   \n",
    "See the Plotting docs.\n",
    "\n",
    "We use the standard convention for referencing the matplotlib API:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.close(\"all\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<AxesSubplot:>"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "ts = pd.Series(np.random.randn(1000),\n",
    "               index=pd.date_range(\"1/1/2000\", periods=1000))\n",
    "\n",
    "ts = ts.cumsum()\n",
    "\n",
    "ts.plot()\n",
    "#plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x2a896234b80>"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "df = pd.DataFrame(\n",
    "    np.random.randn(1000, 4), index=ts.index, columns=[\"A\", \"B\", \"C\", \"E\"]\n",
    ")\n",
    "\n",
    "\n",
    "df = df.cumsum()\n",
    "\n",
    "plt.figure()\n",
    "\n",
    "df.plot()\n",
    "\n",
    "plt.legend(loc='best')\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Importing and exporting data \n",
    "\n",
    "CSV   \n",
    "Writing to a csv file: using DataFrame.to_csv()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.to_csv(\"foo.csv\")\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Reading from a csv file: using read_csv()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Unnamed: 0</th>\n",
       "      <th>A</th>\n",
       "      <th>B</th>\n",
       "      <th>C</th>\n",
       "      <th>D</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2000-01-01</td>\n",
       "      <td>-0.598752</td>\n",
       "      <td>1.529343</td>\n",
       "      <td>0.191299</td>\n",
       "      <td>0.184771</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2000-01-02</td>\n",
       "      <td>-0.531400</td>\n",
       "      <td>1.226608</td>\n",
       "      <td>-0.576043</td>\n",
       "      <td>-0.379976</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2000-01-03</td>\n",
       "      <td>-0.789373</td>\n",
       "      <td>0.738564</td>\n",
       "      <td>0.815602</td>\n",
       "      <td>0.005079</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2000-01-04</td>\n",
       "      <td>-1.125629</td>\n",
       "      <td>1.190547</td>\n",
       "      <td>0.842888</td>\n",
       "      <td>0.640739</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2000-01-05</td>\n",
       "      <td>-0.829933</td>\n",
       "      <td>1.705728</td>\n",
       "      <td>0.747996</td>\n",
       "      <td>0.053204</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>995</th>\n",
       "      <td>2002-09-22</td>\n",
       "      <td>-3.017146</td>\n",
       "      <td>32.869633</td>\n",
       "      <td>48.908706</td>\n",
       "      <td>-54.324539</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>996</th>\n",
       "      <td>2002-09-23</td>\n",
       "      <td>-3.350912</td>\n",
       "      <td>33.655411</td>\n",
       "      <td>47.360900</td>\n",
       "      <td>-55.544262</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>997</th>\n",
       "      <td>2002-09-24</td>\n",
       "      <td>-2.730106</td>\n",
       "      <td>33.871768</td>\n",
       "      <td>47.226325</td>\n",
       "      <td>-55.108026</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>998</th>\n",
       "      <td>2002-09-25</td>\n",
       "      <td>-2.875770</td>\n",
       "      <td>33.493414</td>\n",
       "      <td>46.784927</td>\n",
       "      <td>-53.537256</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>999</th>\n",
       "      <td>2002-09-26</td>\n",
       "      <td>-5.036061</td>\n",
       "      <td>33.263575</td>\n",
       "      <td>47.769011</td>\n",
       "      <td>-53.244739</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1000 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     Unnamed: 0         A          B          C          D\n",
       "0    2000-01-01 -0.598752   1.529343   0.191299   0.184771\n",
       "1    2000-01-02 -0.531400   1.226608  -0.576043  -0.379976\n",
       "2    2000-01-03 -0.789373   0.738564   0.815602   0.005079\n",
       "3    2000-01-04 -1.125629   1.190547   0.842888   0.640739\n",
       "4    2000-01-05 -0.829933   1.705728   0.747996   0.053204\n",
       "..          ...       ...        ...        ...        ...\n",
       "995  2002-09-22 -3.017146  32.869633  48.908706 -54.324539\n",
       "996  2002-09-23 -3.350912  33.655411  47.360900 -55.544262\n",
       "997  2002-09-24 -2.730106  33.871768  47.226325 -55.108026\n",
       "998  2002-09-25 -2.875770  33.493414  46.784927 -53.537256\n",
       "999  2002-09-26 -5.036061  33.263575  47.769011 -53.244739\n",
       "\n",
       "[1000 rows x 5 columns]"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.read_csv(\"foo.csv\")\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Excel \n",
    "Reading and writing to Excel.\n",
    "\n",
    "Writing to an excel file using DataFrame.to_excel():"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "df.to_excel(\"foo.xlsx\", sheet_name=\"Sheet1\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pd.read_excel(\"foo.xlsx\", \"Sheet1\", index_col=None, na_values=[\"NA\"])\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.10.4 ('python310')",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  },
  "orig_nbformat": 4,
  "vscode": {
   "interpreter": {
    "hash": "a888cd810c90be07c3c921372a6d7ff433f5a38d5779dfb2a871d99db75673fb"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
